/**
 * Класс используется для хранения и сравнения дат.
 * Содержит данные о дне, месяце и годе.
 */

#ifndef _DATE_H
#define	_DATE_H

#include <iostream>
#include <QDate>
#include "IllegalArgumentException.h"
#include "conf.h"

namespace etu {
namespace common {

class Date {

    int year;
    int month;
    int day;

public:

    /**
     * Получение сегодняшней даты
     * @return сегодняшняя дата
     */
    static Date now();

    /**
     * Получение незаданной даты.
     * Используется в тех случаях, когда дата не задана
     * @return неизвестная дата
     */
    static Date unkown();

    /**
     * Проверка, является ли дата неизвестной
     * @return true, если дата неизвестна; иначе false
     */
    static bool isUnkown(const Date& date);

    /**
     * Создание даты с заданными днём, месяцем и годом
     * @param year год (4 цифры)
     * @param month месяц в году по порядку (1 - 12)
     * @param day день в месяце (1 - 31)
     * @throws IllegalArgumentException если дата с заданными днём,
     * месяцем и годом не существует
     */
    Date(int year, int month, int day) throw (IllegalArgumentException);

    /**
     * Конструктор копии
     */
    Date(const Date& orig);

    /**
     * Деструктор
     */
    virtual ~Date();

    /**
     * Получение заданного в дате года
     * @return год
     */
    int getYear() const;

    /**
     * Получение заданного в дате месяца
     * @return месяц
     */
    int getMonth() const;

    /**
     * Получение заданного в дате дня
     * @return день
     */
    int getDay() const;

    bool operator==(const Date &date) const;
    bool operator!=(const Date &date) const;
    bool operator>(const Date &date) const;
    bool operator<(const Date &date) const;
    bool operator>=(const Date &date) const;
    bool operator<=(const Date &date) const;
    friend std::ostream& operator<<(std::ostream& os, const Date& date);
    friend std::istream& operator>>(std::istream& is, Date& date);

    /**
     * Создание даты с параметрами по умолчанию (текущая дата)
     */
    Date();

    QDate toQDate() const;
    static Date fromQDate(QDate date);
};

}
}
#endif	/* _DATE_H */
